package com.sanbi.shield.server.facade.annotations;

import lombok.Getter;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Client幂等性注解
 *
 * @author XiaoQingqing
 * @since 2024/08/21
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ClientIdempotent {
    /**
     * 方法标识
     *
     * @return 方法标识
     */
    String methodKey();

    /**
     * 幂等键
     *
     * @return 幂等键
     */
    String key();

    /**
     * 模式
     *
     * @return 模式
     */
    Mode mode();

    /**
     * 范围
     *
     * @return 类型
     */
    Scope scope();

    /**
     * 重试次数
     *
     * @return 重试次数
     */
    int retryTimes();

    /**
     * 模式
     */
    @Getter
    enum Mode {
        SYNC_THROWABLE(1,"同步可抛异常的"),
        SYNC_CATCH(2,"同步不抛异常的"),
        ASYNC(3,"异步"),
        ;

        /**
         * 编码
         */
        private final Integer code;
        /**
         * 名称
         */
        private final String name;

        /**
         * 构造器
         *
         * @param code 编码
         * @param name 名称
         */
        Mode(Integer code, String name){
            this.code = code;
            this.name = name;
        }
    }

    /**
     * 范围
     */
    @Getter
    enum Scope {
        GLOBAL_ONLY(1,"全局唯一"),
        OPERATE_ONLY(2,"操作唯一"),
        EXECUTE_ONLY(3,"执行中唯一"),
        ;

        /**
         * 编码
         */
        private final Integer code;
        /**
         * 名称
         */
        private final String name;

        /**
         * 构造器
         *
         * @param code 编码
         * @param name 名称
         */
        Scope(Integer code, String name){
            this.code = code;
            this.name = name;
        }
    }
}
